/* 
 * File:   universidade.c
 * Author: Vagner Clementino
 *
 * Created on 7 de Abril de 2012, 07:40
 */

#include <stdio.h>
#include <stdlib.h>
#include "universidade.h"


universidade* cria_universidade(int id_universidade, int num_vagas){
    
    universidade* u = NULL;    
    u = (universidade*) malloc(sizeof(universidade));
    if(u == NULL){
        /*Erro na alocar o espaço*/
        printf("Erro em alocar memoria para a estrutura universidade.\n");
        exit(-4);
    }else{
        u->id = id_universidade;
        u->num_vagas = num_vagas;
        u->vagas_preenchidas = 0;
        u->lista_alunos = (aluno_matriculado*) cria_alunos_matriculados(num_vagas);
        if(u->lista_alunos == NULL){
           printf("Erro em alocar memoria para a lista de alunos matriculados"
                   ".\n");
           exit(-5);
        }
       return u;
    }    
}

void desaloca_universidade(universidade* p){
    free(p);
}

aluno_matriculado* cria_alunos_matriculados(int num_vagas){
    aluno_matriculado* a;
    a = (aluno_matriculado*) malloc(num_vagas * sizeof(aluno_matriculado));
    
    if(a == NULL){
        fprintf(stderr,"Erro na alocacao dinamica da estrutura "
                "aluno_matriculado.\n");
        exit(-8);
    }else{
        return a;
    }
    
}

void desaloca_lista_alunos(universidade** u){
    free((*u)->lista_alunos);
}

void imprime_universidade(const universidade* u){
    printf("ID universidade: %d\n", u->id);
    printf("Vagas: %d \n",u->num_vagas);
    if(u->vagas_preenchidas > 0){
      imprime_alunos_matriculados(u, u->num_vagas,stdout);
    }
    else{
        printf("Não há alunos matriculados.\n");
    }
}

void imprime_alunos_matriculados(const universidade* u,int tam_lista,
                                 FILE* arquivo_saida){
    int i;
    fprintf(arquivo_saida,"%d:",u->id);
    for(i=0;i<tam_lista;i++){
        fprintf(arquivo_saida,"%d ",u->lista_alunos[i].id_aluno);
    }
    fprintf(arquivo_saida,"\n");
}

void Particao_lista(int Esq, int Dir, 
              int *i, int *j, aluno_matriculado** A)
{ aluno_matriculado x, w;
  *i = Esq;  *j = Dir;
  x = (*A)[(*i + *j) / 2]; /* obtem o pivo x */
  do 
    { while (x.nota_aluno > (*A)[*i].nota_aluno) (*i)++;
      while (x.nota_aluno < (*A)[*j].nota_aluno) (*j)--;
      if (*i <= *j) 
      { w = (*A)[*i]; (*A)[*i] = (*A)[*j]; (*A)[*j] = w;
        (*i)++; (*j)--;
      }
    } while (*i <= *j);
}

void Ordena_lista(int Esq, int Dir, aluno_matriculado** A)
{ int i, j;
  Particao_lista(Esq, Dir, &i, &j, A);
  if (Esq < j) Ordena(Esq, j, A);
  if (i < Dir) Ordena(i, Dir, A);
}

void ordena_alunos_matriculados (aluno_matriculado** a_matriculados, int tam_lista){
    Ordena_lista(0, tam_lista-1, a_matriculados); }